<?php

namespace Gwit\PlateformBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

use Gwit\PlateformBundle\Entity\Widget;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
/**
 * Description of WidgetController
 *
 * @author root
 */
class WidgetController extends Controller {

    
    public function indexAction() {
        return new Response('Hello world!');
    }
    
    /**
     * Fonction de sauvegarde d'un widget
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws AccessDeniedException 
     */
    public function saveAction(Request $request){
        $em = $this->getDoctrine()->getEntityManager();
        if($request->getMethod() == 'POST') {
            if ($request->isXmlHttpRequest())
            {
                if (0 === strpos($this->getRequest()->headers->get('Content-Type'), 'application/json')) {
                    
                    $user = $this->container->get('security.context')->getToken()->getUser();
                    
                    // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
                    if( ! is_object($user))
                    {
                        throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
                    }
                    
                    try{
                        //Get POST data
                        $data = json_decode($this->getRequest()->getContent(), true);
                        $this->getRequest()->request->replace(is_array($data) ? $data : array());
                        //Creation de l'entité moniteur
                        $entity = new Widget();
                        $entity->setName($data["name"]);
                        $entity->setMonitorId($data["monitor"]);
                        $entity->setUserId($user->getId());
                        
                        //TODO: Modifier la base de donnée pour avoir position relatif sur ecran
                        $entity->setPosition(1);
                        $entity->setFavorite(0);
                        
                        //Save into database
                        $em->persist($entity);
                        $em->flush();
                        
                        $post=array();
                        
                        $post[0] = $entity->getId();
                        //On renvoi l'objet qui sera crée afin de récupérer les variables par défaut
                        $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new 
                            JsonEncoder()));
                        $json = $serializer->serialize($entity, 'json');

                        return new Response($json);
                        
                    }catch(Exception $e){
                        return new Response($e);
                    }
                }
            }
        }
        return new Response("End");
    }
    
    /**
     * 
     */
    public function loadAction(Request $request){
        $user = $this->container->get('security.context')->getToken()->getUser();

        // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
        if( ! is_object($user) )
        {
            throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
        }
        
        $em = $this->getDoctrine()->getEntityManager();

        $widgets = $em->getRepository('GwitPlateformBundle:Widget')->findBy(array('user_id' => $user->getId()), array('dateCreated' => 'ASC'));
        
        $post=array();
        $i = 0;
        foreach($widgets as $widget){
            $post[$i] = array(
                "name" => $widget->getName(),
                "position" => $widget->getPosition(),
                "favoris" => $widget->getFavorite(),
            );
            $i = 1 + $i;
        }
        
        $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new 
            JsonEncoder()));
        $json = $serializer->serialize($widgets, 'json');

        
        return new Response($json);
    }
    
    /**
     *
     * @param Request $request 
     */
    public function deleteAction(Request $request){
        $em = $this->getDoctrine()->getEntityManager();
        
        if($request->getMethod() == 'POST') {
            if ($request->isXmlHttpRequest())
            {
                if (0 === strpos($this->getRequest()->headers->get('Content-Type'), 'application/json')) {
                    
                    $user = $this->container->get('security.context')->getToken()->getUser();

                    // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
                    if( ! is_object($user) )
                    {
                        throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
                    }
                    
                    try{
                        //Get POST data
                        $data = json_decode($this->getRequest()->getContent(), true);
                        $this->getRequest()->request->replace(is_array($data) ? $data : array());
                        
                        //Select monitor
                        $entity = $em->getRepository('GwitPlateformBundle:Widget')->findBy(
                                array('id' => $data["id"], 'user_id' => $user->getId()));
                        
                        if (!$entity) {
                            throw $this->createNotFoundException('Unable to find widget.');
                        }
                        
                        //delete into database
                        $em->remove($entity[0]);
                        $em->flush();
                        
                        return new Response("Widget détruit !");
                    }catch(Exception $e){
                        return new Response($e);
                    }
                }
            }
        }
    }
    
    /**
     * Controlleur de mise à jour d'un moniteur
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws AccessDeniedException
     * @throws type 
     */
    public function updateAction(Request $request){
        $em = $this->getDoctrine()->getEntityManager();
        
        if($request->getMethod() == 'POST') {
            if ($request->isXmlHttpRequest())
            {
                if (0 === strpos($this->getRequest()->headers->get('Content-Type'), 'application/json')) {
                    
                    $user = $this->container->get('security.context')->getToken()->getUser();

                    // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
                    if( ! is_object($user) )
                    {
                        throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
                    }
                    
                    try{
                        //Get POST data
                        $data = json_decode($this->getRequest()->getContent(), true);
                        $this->getRequest()->request->replace(is_array($data) ? $data : array());
                        
                        //Select monitor
                        $entity = $em->getRepository('GwitPlateformBundle:Widget')->findBy(
                                array('id' => $data["id"], 'user_id' => $user->getId()));
                        
                        if (!$entity) {
                            throw $this->createNotFoundException('Unable to find widget.');
                        }
                        
                        //update all data
                        $entity[0]->setposition($data["position"]);
                        $entity[0]->setCoordX($data["coordX"]);
                        $entity[0]->setCoordY($data["coordY"]);
                        $entity[0]->setHeight($data["height"]);
                        $entity[0]->setWidth($data["width"]);
                        
                        //save into database
                        $em->persist($entity[0]);
                        $em->flush();
                        
                        return new Response("Widget modifier !");
                    }catch(Exception $e){
                        return new Response($e);
                    }
                }
            }
        }
        
        return new Response("End");
    }
    
    /**
     * TODO: Test sur la sauvegarde
     */
    public function testAction(Request $request){
        
    }
}

?>